package com.dingding.service.core.common.service.impl;

import java.util.Date;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import com.dingding.common.core.beans.Phonevalidate;
import com.dingding.common.core.util.ToolUtil;
import com.dingding.facade.user.common.dto.special.driver.ReqValidateDTO;
import com.dingding.service.core.common.dao.IValidateDao;
import com.dingding.service.core.common.service.IValidateService;

/**
 * 
 * @ClassName: ValidateServiceImpl 
 * @Description: 验证业务逻辑接口 
 * @author YHQ
 * @date 2016年12月5日 上午11:18:48
 * @since V2.5.7
 * 
 */
@Component("validateService")
public class ValidateServiceImpl implements IValidateService{

	@Resource(name = "validateDao")
	private IValidateDao validateDao;
	
	/**
	 * 
	 * @Title: validateCode 
	 * @Description: 验证手机验证码
	 * @param reqValidateDTO 验证手机验证码
	 * @author YHQ 
	 * @since V2.5.7
	 * @return boolean true:验证成功   false:验证失败
	 * 
	 */
	@Override
	public boolean validateCode(ReqValidateDTO reqValidateDTO) {
		
		boolean validateResult = false;
		
		// 判断请求参数是否为空
		if(reqValidateDTO == null || !ToolUtil.validateParam(reqValidateDTO)){
			
			return validateResult;
		}
		
		// 根据手机号获取该手机验证码
		Phonevalidate phonevalidate = validateDao.getPhoneValidate(reqValidateDTO.getTelPhone());
		
		// 判断该手机验证码是否可用
		boolean flag = isEffective(phonevalidate);
		
		if(flag){
			
			// 判断验证码是否正确
			if(phonevalidate.getValidateNum().equals(reqValidateDTO.getValidateCode())){
				phonevalidate.setValidateCodeNumber(0); // 输入错误次数置0
				phonevalidate.setIsValid(2); // 验证码正确，将该验证设置为无效(已使用)
				validateResult = true;
			}else{
				phonevalidate.setValidateCodeNumber(phonevalidate.getValidateCodeNumber() + 1); // 输入错误次数 +1
			}
			
			// 修改验证码信息
			validateDao.updateValidate(phonevalidate);
		}
		
		return validateResult;
	}

	/**
	 * 
	 * @Title: isEffective 
	 * @Description: 是否有效
	 * @param phonevalidate 判断该验证码是否有效
	 * @author YHQ 
	 * @return void    返回类型
	 * 
	 */
	public boolean isEffective(Phonevalidate phonevalidate){
		
		if(phonevalidate != null){
			
			// 判断验证码验证次数是否小于五次
			if(phonevalidate.getValidateCodeNumber() >= 5){
				return false;
			}
			
			// 判断验证码是否有效
			Date validateTime = phonevalidate.getCreateTime();
			
			// 验证手机验证码是否超时
			boolean validateFlag = ToolUtil.validateTimeOut(validateTime);
			
			if (!validateFlag) {
				
				phonevalidate.setIsValid(2); // 验证码超时,设置该验证码为无效状态
				
				return false;
			}
			
		}else{
			return false;
		}
		
		return true;
	}
	
}
